package com.demo.utils;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.log4j.Log4j2;

import java.util.HashMap;
import java.util.Map;
@Log4j2
public class JWTUtil {
    // 定义了用于 JWT 签名的密钥
    public static final String JWT_SECRET = "~m`ja8*&s0t)jk";
    /*
    生成JWT令牌
    withClaim("data", jsonStr)：自定义一个data字段，值为传入的 JSON 字符串（如用户 ID、角色等信息）；
    注意：负载数据会被 Base64 编码（可逆向解码），因此不能存储敏感信息（如密码）
     */
    public static String createJWT(String jsonStr){
        Map<String, Object> headers = new HashMap<>();
        headers.put("alg","HS256"); // 指定签名算法为HMAC-SHA256
        headers.put("typ","JWT");  // 指定令牌类型为JWT
        return JWT.create()
                .withHeader(headers) // jwt 的头部消息
                .withClaim("data",jsonStr) // jwt的负载消息
                .sign(Algorithm.HMAC256(JWT_SECRET)); // jwt签名是 JWT 的第三部分，用于保证令牌不被篡改
    }
    /*
    验证jwt令牌
     */
    public static Boolean verifyJWT(String jwt){
        try {
            JWT.require(Algorithm.HMAC256(JWT_SECRET)).build().verify(jwt);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /*
    解析 jwt令牌，获取载体消息
     */
    public static String parseJWT(String jwt){
        // 创建 jwt 解析对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JWT_SECRET)).build();
        // 进行验证
        DecodedJWT decodedJWT = jwtVerifier.verify(jwt);
        // 获取负载消息
        Claim claim = decodedJWT.getClaim("data");
        return claim.asString();
    }
    /*
    测试
     */
    public static void main(String[] args) {
        String jwt = createJWT("{\"username\":\"jackson\",\"password\":\"root\"}");
        log.info("签名：{}",verifyJWT(jwt));
        log.info("解析：{}",parseJWT(jwt));

    }
}
